package com.beiben.system.file.service.impl;

import com.beiben.system.file.domain.File;
import com.beiben.system.file.mapper.FileMapper;
import com.beiben.system.file.service.IFileService;
import com.beiben.utils.file.FileTypeUtils;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.exception.BaseException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.framework.web.exception.GlobalExceptionHandler;
import org.apache.commons.io.FilenameUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 文件管理Service业务层处理
 *
 * @author xgq
 * @date 2020-08-24
 */
@Service
public class FileServiceImpl implements IFileService {

    private static final Logger log = LoggerFactory.getLogger(FileServiceImpl.class);

    @Autowired
    private FileMapper fileMapper;

    /**
     * 查询文件管理
     *
     * @param id 文件管理ID
     * @return 文件管理
     */
    @Override
    public File selectFileById(Long id) {
        return fileMapper.selectFileById(id);
    }

    /**
     * 查询文件管理列表
     *
     * @param file 文件管理
     * @return 文件管理
     */
    @Override
    public List<File> selectFileList(File file) {
        return fileMapper.selectFileList(file);
    }

    /**
     * 新增文件管理
     *
     * @param file 文件管理
     * @return 结果
     */
    @Override
    public int insertFile(File file) {
        file.setCreateTime(DateUtils.getNowDate());
        return fileMapper.insertFile(file);
    }

    /**
     * 修改文件管理
     *
     * @param file 文件管理
     * @return 结果
     */
    @Override
    public int updateFile(File file) {
        return fileMapper.updateFile(file);
    }

    /**
     * 批量删除文件管理
     *
     * @param ids 需要删除的文件管理ID
     * @return 结果
     */
    @Override
    public int deleteFileByIds(Long[] ids) {
        List<File> files = fileMapper.selectFileByIds(ids);
        deleteFile(files);
        return fileMapper.deleteFileByIds(ids);
    }

    /**
     * 删除文件管理信息
     *
     * @param id 文件管理ID
     * @return 结果
     */
    @Override
    public int deleteFileById(Long id) {
        return fileMapper.deleteFileById(id);
    }

    /**
     * 上传见证性材料
     *
     * @param files
     * @param tableId 关联ID
     * @return
     * @throws IOException
     */
    @Override
    public void uploadFile(MultipartFile[] files, Long tableId,String tableName,String serverType) throws IOException {
        //TODO 权限管理 分任务所属人上传见证性材料
        //TODO 检查是否 输出文件是否上传
        // 上传文件路径
        String filePath = RuoYiConfig.getProfile()+"/"+serverType;
        for (MultipartFile file : files) {
            File sysFile = new File();
            sysFile.setTableId(tableId);
            // 上传的文件名称
            sysFile.setName(file.getOriginalFilename());
            // 上传并返回新文件名称
            String fileName = FileUploadUtils.upload(filePath, file);
            String url = /*serverConfig.getUrl() + */fileName;
            sysFile.setUri(url);
            //文件类型：根据文件后缀获取文件类型
            sysFile.setType(String.valueOf(FileTypeUtils.getType(FilenameUtils.getExtension(file.getOriginalFilename()))));
            //关联表名
            sysFile.setTableName(tableName);
            sysFile.setCreateTime(DateUtils.getNowDate());
            // 保存上传信息
            int count = insertFile(sysFile);
            if (count < 0) {
                throw new BaseException("文件上传失败");
            }
            Map<String, Object> fileInfo = new HashMap<>();
            fileInfo.put("fileName", fileName);
            fileInfo.put("url", url);
            fileInfo.put("url", url);
        }
    }

    /**
     * 批量删除文件管理
     *
     * @param tableIds 需要删除的文件管理关联IDS
     * @return 结果
     */
    @Override
    public int deleteFileByTableIds(String tableName, Long[] tableIds) {
        List<File> files = fileMapper.selectFileByTableIds(tableName,tableIds);
        deleteFile(files);
        return fileMapper.deleteFileByTableIds(tableName,tableIds);
    }

    public void deleteFile(List<File> files){
        for (File file : files) {
            String uri = file.getUri();
            String realFileName = FileUploadUtils.getDefaultBaseDir() + uri.substring(uri.indexOf("/profile") + 8);
            if (!FileUtils.deleteFile(realFileName)){
                log.error("删除文件失败，文件路径："+realFileName);
            }
        }
    }

    /**
     * 上传见证性材料
     *
     * @param files
     * @param tableId 关联ID
     * @return
     * @throws IOException
     */
    @Override
    public void uploadFileName(MultipartFile[] files, Long tableId,String tableName,String serverType,String imageName) throws IOException {
        //TODO 权限管理 分任务所属人上传见证性材料
        //TODO 检查是否 输出文件是否上传
        // 上传文件路径
        String filePath = RuoYiConfig.getProfile()+"/"+serverType;
        for (MultipartFile file : files) {
            File sysFile = new File();
            sysFile.setTableId(tableId);
            // 上传的文件名称
            if(StringUtils.isNotEmpty(imageName)){
                sysFile.setName(imageName);
            }else{
                throw new BaseException("请选择上传文件名称");
            }
            // 上传并返回新文件名称
            String fileName = FileUploadUtils.upload(filePath, file);
            String url = /*serverConfig.getUrl() + */fileName;
            sysFile.setUri(url);
            //文件类型：根据文件后缀获取文件类型
            sysFile.setType(String.valueOf(FileTypeUtils.getType(FilenameUtils.getExtension(file.getOriginalFilename()))));
            //关联表名
            sysFile.setTableName(tableName);
            sysFile.setCreateTime(DateUtils.getNowDate());
            // 保存上传信息
            int count = insertFile(sysFile);
            if (count < 0) {
                throw new BaseException("文件上传失败");
            }
            Map<String, Object> fileInfo = new HashMap<>();
            fileInfo.put("fileName", fileName);
            fileInfo.put("url", url);
            fileInfo.put("url", url);
        }
    }
}

